C++复习 enum

  1. enum枚举类型

enum枚举类型

//限定作用域的枚举类型(c++11)
enum class open_modes { input, output, append };
//不限定作用域的枚举类型
enum color { red, yellow, green };
//不限定作用域的匿名枚举类型
enum { floatPrec = 6, doublePrec = 10 };
  • 匿名枚举类型用处

    • 在程序中需要数值的名字的时候使用
      • 宏定义的缺点:在预处理阶段只做简单替换不做安全检查
      • 匿名的enum枚举:编译器会对其进行类型检查,若代码中其他地方有和该名字冲突的,会报错
      • 静态变量: 作用域在本文件内,编译阶段检查,比匿名enum内存占用多

        c语言之枚举类型(enum)

  • 和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。

  • 关键字是 enum class(等价enum struct)
  • 限定作用域枚举类型,作用域外无法访问;不限定作用域的枚举类型,枚举成员的作用域和枚举类型本身的作用域一致
enum class /*struct*/ MyEnum { A = 0};        // 限定作用域的枚举
enum class /*struct*/ MyEnum1 { A = 0 };    // 限定作用域的枚举可以有重复的名字,使用时也必须加上作用域
enum MyEnum2 { B = 0 };                        // 不限定作用域的枚举
enum MyEnum3 { B = 0 };                        // 不限定作用域的枚举不能有重复的名字
enum {test = 0} t,t1;                        // 未命名的不限定作用域的枚举,只能在定义是就定义对象
MyEnum::A;                                          //限定作用域的枚举要带上作用域
B;                                                     //true
  • 默认情况下,枚举值从0开始,依次加1,如果没有显示提供值,就在前一个枚举值的基础上加1。枚举成员是const的。

  • 只要enum有名字,我们就能定义并初始化该类型的成员。想要初始化enum对象或者为enum对象赋值,必须使用该类型的一个枚举成员或者该类型的另一个对象。

  • 一个不限定作用域的枚举类型的对象或枚举成员自动的转成整型

  • 在C++11新标准中,我们可以在enum的名字后加上冒号以及我们想在该enum中使用的类型。对于不限定作用域的枚举类型来说,其枚举成员不存在默认类型,我们只知道成员的潜在类型足够大,肯定能容纳枚举值。如果我们指定了潜在类型,则一旦超出范围将引发错误。对于限定作用域的枚举成员,其缺省为int类型

  • 在C++11 新标准中,我们可以提前声明enum。enum的前置声明必须指定其成员的大小。

    enum test : long;    // 不限定作用域的,必须指定成员类型
    enum class test1;    // 限定作用域的枚举类型可以使用默认成员类型int
    
  • int值不可以做以enmu为形参的函数的实参。对与不限定作用域的enum做形参时,enum的值提升成int或更大的整型(注意只会提升成对应整型,不会隐式转换为unsigned char之类),实际提升的结果由枚举类型的潜在类型决定。